package test;

import java.io.Externalizable;
import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * <P> @Author: ideaAdmin
 * <P> TODO: Class
 * <P> TODO: 单例模式
 * <P> Date: 2022/3/24:8:48
 * <P> Description:
 */

public class SingletonSer implements Serializable {

    private static final long serialVersionUID = 16666666L;
    private int id;
    private String name;
    private volatile static SingletonSer singletonSer;

    private SingletonSer() {
    }

    public static SingletonSer getInstance() {

        if (singletonSer == null) {
            synchronized (SingletonSer.class) {
                if (singletonSer == null) {
                    singletonSer = new SingletonSer();
                }
            }
        }

        return singletonSer;
    }


    // 防止反序列化获取多个对象的漏洞。
    // 无论是实现Serializable接口，或是 Externalizable 接口，当从I/O流中读取对象时，readResolve()方法都会被调用到。
    // 实际上就是用readResolve()中返回的对象直接替换在反序列化过程中创建的对象。
    //重写方法 反序列化的时候从这个方法读取对象
    private Object readResolve() {
        return singletonSer;
    }


}
